import type { Question } from '@/types/exam';

/**
 * SQL基础语法题目（初级10道 + 中级10道 + 高级10道）
 */
export const basicQuestions: Question[] = [
	// ========== 初级题目（10道） ==========
	{
		id: 2001,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: 'SQL中，以下哪个数据类型用于存储精确的小数？',
		options: [
			{ key: 'A', text: 'FLOAT' },
			{ key: 'B', text: 'DOUBLE' },
			{ key: 'C', text: 'DECIMAL' },
			{ key: 'D', text: 'REAL' }
		],
		answer: ['C'],
		explanation: 'DECIMAL（或NUMERIC）用于存储精确的小数，不会产生浮点数精度误差。FLOAT和DOUBLE是浮点类型，可能存在精度问题。'
	},
	{
		id: 2002,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: '在SQL中，创建表的关键字是？',
		options: [
			{ key: 'A', text: 'CREATE' },
			{ key: 'B', text: 'CREATE TABLE' },
			{ key: 'C', text: 'NEW TABLE' },
			{ key: 'D', text: 'MAKE TABLE' }
		],
		answer: ['B'],
		explanation: 'CREATE TABLE是SQL中用于创建表的标准语法。关键字是CREATE TABLE，不是单独的CREATE。'
	},
	{
		id: 2003,
		techId: 'sql',
		type: 'judge',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: 'VARCHAR类型是固定长度的字符串类型。',
		options: [
			{ key: 'A', text: '正确' },
			{ key: 'B', text: '错误' }
		],
		answer: ['B'],
		explanation: '错误。VARCHAR是可变长度的字符串类型，按实际长度存储。CHAR才是固定长度的字符串类型。'
	},
	{
		id: 2004,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: '在MySQL中，用于自动递增主键的关键字是？',
		options: [
			{ key: 'A', text: 'AUTO_INCREMENT' },
			{ key: 'B', text: 'SERIAL' },
			{ key: 'C', text: 'IDENTITY' },
			{ key: 'D', text: 'AUTO' }
		],
		answer: ['A'],
		explanation: 'AUTO_INCREMENT是MySQL中用于自动递增主键的关键字。SERIAL是PostgreSQL的用法，IDENTITY是SQL Server的用法。'
	},
	{
		id: 2005,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: '以下哪个约束用于确保列的值唯一？',
		options: [
			{ key: 'A', text: 'PRIMARY KEY' },
			{ key: 'B', text: 'UNIQUE' },
			{ key: 'C', text: 'NOT NULL' },
			{ key: 'D', text: 'FOREIGN KEY' }
		],
		answer: ['B'],
		explanation: 'UNIQUE约束确保列的值唯一。PRIMARY KEY也保证唯一性，但它是主键约束。NOT NULL只保证非空，FOREIGN KEY是外键约束。'
	},
	{
		id: 2006,
		techId: 'sql',
		type: 'judge',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: 'DROP TABLE语句会删除表结构和表中的所有数据。',
		options: [
			{ key: 'A', text: '正确' },
			{ key: 'B', text: '错误' }
		],
		answer: ['A'],
		explanation: '正确。DROP TABLE会完全删除表，包括表结构和所有数据，操作不可逆。'
	},
	{
		id: 2007,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: '在SQL中，用于修改表结构的关键字是？',
		options: [
			{ key: 'A', text: 'MODIFY TABLE' },
			{ key: 'B', text: 'ALTER TABLE' },
			{ key: 'C', text: 'CHANGE TABLE' },
			{ key: 'D', text: 'UPDATE TABLE' }
		],
		answer: ['B'],
		explanation: 'ALTER TABLE是SQL中用于修改表结构的标准关键字。可以添加、删除、修改列和约束。'
	},
	{
		id: 2008,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: 'DATE类型用于存储？',
		options: [
			{ key: 'A', text: '日期和时间' },
			{ key: 'B', text: '只有日期' },
			{ key: 'C', text: '只有时间' },
			{ key: 'D', text: '时间戳' }
		],
		answer: ['B'],
		explanation: 'DATE类型只存储日期部分（年-月-日），不包含时间。DATETIME存储日期和时间，TIME只存储时间，TIMESTAMP存储时间戳。'
	},
	{
		id: 2009,
		techId: 'sql',
		type: 'single',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: '以下哪个约束用于确保列的值不为空？',
		options: [
			{ key: 'A', text: 'PRIMARY KEY' },
			{ key: 'B', text: 'UNIQUE' },
			{ key: 'C', text: 'NOT NULL' },
			{ key: 'D', text: 'CHECK' }
		],
		answer: ['C'],
		explanation: 'NOT NULL约束确保列的值不能为空。PRIMARY KEY自动包含NOT NULL，但NOT NULL是独立的约束。'
	},
	{
		id: 2010,
		techId: 'sql',
		type: 'judge',
		difficulty: 'easy',
		category: 'SQL基础语法',
		question: '一个表可以有多个主键。',
		options: [
			{ key: 'A', text: '正确' },
			{ key: 'B', text: '错误' }
		],
		answer: ['B'],
		explanation: '错误。一个表只能有一个主键，但主键可以由多个列组成（复合主键）。'
	},
	// ========== 中级题目（10道） ==========
	{
		id: 2011,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '在创建表时，以下哪个语句可以同时设置主键和外键？',
		options: [
			{ key: 'A', text: 'PRIMARY KEY和FOREIGN KEY不能同时使用' },
			{ key: 'B', text: '可以，但FOREIGN KEY必须引用其他表的主键' },
			{ key: 'C', text: '可以，FOREIGN KEY可以引用任意列' },
			{ key: 'D', text: '可以，但必须先创建被引用的表' }
		],
		answer: ['B'],
		explanation: '可以同时使用。FOREIGN KEY必须引用其他表的主键或唯一键。创建表时，被引用的表必须已经存在。'
	},
	{
		id: 2012,
		techId: 'sql',
		type: 'multiple',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '以下哪些是MySQL支持的数值类型？',
		options: [
			{ key: 'A', text: 'INT' },
			{ key: 'B', text: 'BIGINT' },
			{ key: 'C', text: 'DECIMAL' },
			{ key: 'D', text: 'NUMERIC' }
		],
		answer: ['A', 'B', 'C', 'D'],
		explanation: 'MySQL支持所有这些数值类型。INT和BIGINT是整数类型，DECIMAL和NUMERIC是精确小数类型（在MySQL中NUMERIC是DECIMAL的同义词）。'
	},
	{
		id: 2013,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: 'ALTER TABLE添加列时，如果列定义为NOT NULL但没有默认值，会发生什么？',
		options: [
			{ key: 'A', text: '自动使用0作为默认值' },
			{ key: 'B', text: '自动使用空字符串作为默认值' },
			{ key: 'C', text: '操作失败，必须提供默认值' },
			{ key: 'D', text: '取决于数据库，MySQL会失败' }
		],
		answer: ['D'],
		explanation: '在MySQL中，如果表已有数据，添加NOT NULL列且无默认值会失败。必须提供DEFAULT值或先删除NOT NULL约束。不同数据库处理方式不同。'
	},
	{
		id: 2014,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '以下哪个语句可以安全地删除表（如果表不存在也不报错）？',
		options: [
			{ key: 'A', text: 'DROP TABLE users' },
			{ key: 'B', text: 'DROP TABLE IF EXISTS users' },
			{ key: 'C', text: 'DELETE TABLE users' },
			{ key: 'D', text: 'REMOVE TABLE users' }
		],
		answer: ['B'],
		explanation: 'DROP TABLE IF EXISTS可以在表不存在时也不报错，这是最安全的删除表方式。'
	},
	{
		id: 2015,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '在MySQL中，CHAR(10)和VARCHAR(10)的区别是什么？',
		options: [
			{ key: 'A', text: '没有区别' },
			{ key: 'B', text: 'CHAR固定长度，VARCHAR可变长度' },
			{ key: 'C', text: 'CHAR用于数字，VARCHAR用于字符串' },
			{ key: 'D', text: 'CHAR更快，但VARCHAR更节省空间' }
		],
		answer: ['B'],
		explanation: 'CHAR是固定长度，即使存储的字符少于指定长度，也会填充空格到指定长度。VARCHAR是可变长度，按实际长度存储。CHAR查询更快，但VARCHAR更节省空间。'
	},
	{
		id: 2016,
		techId: 'sql',
		type: 'multiple',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '以下哪些约束可以确保数据的完整性？',
		options: [
			{ key: 'A', text: 'PRIMARY KEY' },
			{ key: 'B', text: 'FOREIGN KEY' },
			{ key: 'C', text: 'CHECK' },
			{ key: 'D', text: 'UNIQUE' }
		],
		answer: ['A', 'B', 'C', 'D'],
		explanation: '所有选项都用于确保数据完整性：PRIMARY KEY确保唯一性和非空，FOREIGN KEY确保引用完整性，CHECK确保值满足条件，UNIQUE确保唯一性。'
	},
	{
		id: 2017,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '在创建表时，如何定义一个自增主键？',
		options: [
			{ key: 'A', text: 'id INT PRIMARY KEY AUTO' },
			{ key: 'B', text: 'id INT AUTO_INCREMENT PRIMARY KEY' },
			{ key: 'C', text: 'id INT PRIMARY KEY INCREMENT' },
			{ key: 'D', text: 'id INT PRIMARY KEY AUTO_INCREMENT' }
		],
		answer: ['D'],
		explanation: '在MySQL中，使用AUTO_INCREMENT关键字定义自增主键。语法是：列名 INT PRIMARY KEY AUTO_INCREMENT。'
	},
	{
		id: 2018,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '外键约束中的ON DELETE CASCADE是什么意思？',
		options: [
			{ key: 'A', text: '删除主表记录时，自动删除子表相关记录' },
			{ key: 'B', text: '删除子表记录时，自动删除主表记录' },
			{ key: 'C', text: '删除记录时，自动创建新记录' },
			{ key: 'D', text: '删除记录时，自动更新外键值' }
		],
		answer: ['A'],
		explanation: 'ON DELETE CASCADE表示级联删除：当删除主表（被引用表）的记录时，自动删除子表（引用表）中所有相关记录。'
	},
	{
		id: 2019,
		techId: 'sql',
		type: 'judge',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: '一个表可以有多个外键。',
		options: [
			{ key: 'A', text: '正确' },
			{ key: 'B', text: '错误' }
		],
		answer: ['A'],
		explanation: '正确。一个表可以有多个外键，分别引用不同的表。例如订单表可以同时有user_id外键引用用户表，product_id外键引用产品表。'
	},
	{
		id: 2020,
		techId: 'sql',
		type: 'single',
		difficulty: 'medium',
		category: 'SQL基础语法',
		question: 'DECIMAL(10, 2)中的10和2分别表示什么？',
		options: [
			{ key: 'A', text: '10表示总长度，2表示小数位数' },
			{ key: 'B', text: '10表示整数位数，2表示小数位数' },
			{ key: 'C', text: '10表示最大长度，2表示最小长度' },
			{ key: 'D', text: '10表示精度，2表示标度' }
		],
		answer: ['A'],
		explanation: 'DECIMAL(10, 2)中，10表示总位数（精度），2表示小数位数（标度）。例如可以存储最大99999999.99。'
	},
	// ========== 高级题目（10道） ==========
	{
		id: 2021,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在MySQL中，如果需要修改列的数据类型，应该使用哪个语句？',
		options: [
			{ key: 'A', text: 'ALTER TABLE table_name CHANGE column_name new_type' },
			{ key: 'B', text: 'ALTER TABLE table_name MODIFY column_name new_type' },
			{ key: 'C', text: 'ALTER TABLE table_name ALTER COLUMN column_name new_type' },
			{ key: 'D', text: 'A和B都可以，但语法略有不同' }
		],
		answer: ['D'],
		explanation: '在MySQL中，可以使用MODIFY或CHANGE来修改列类型。MODIFY语法：ALTER TABLE table MODIFY column new_type；CHANGE语法：ALTER TABLE table CHANGE old_column new_column new_type（需要同时指定新列名）。'
	},
	{
		id: 2022,
		techId: 'sql',
		type: 'multiple',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '以下哪些操作会导致外键约束失败？',
		options: [
			{ key: 'A', text: '删除被外键引用的主表记录' },
			{ key: 'B', text: '在子表中插入不存在于主表的外键值' },
			{ key: 'C', text: '修改主表主键值，而子表有引用该值' },
			{ key: 'D', text: '删除主表（如果子表存在）' }
		],
		answer: ['A', 'B', 'C', 'D'],
		explanation: '所有这些操作都会导致外键约束失败（除非设置了级联操作）。外键约束确保引用完整性，防止违反引用的操作。'
	},
	{
		id: 2023,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在创建表时，如何定义一个检查约束，确保价格大于0？',
		options: [
			{ key: 'A', text: 'price DECIMAL(10,2) CHECK price > 0' },
			{ key: 'B', text: 'price DECIMAL(10,2) CHECK (price > 0)' },
			{ key: 'C', text: 'price DECIMAL(10,2) CONSTRAINT chk_price CHECK (price > 0)' },
			{ key: 'D', text: 'B和C都可以，取决于数据库' }
		],
		answer: ['D'],
		explanation: '检查约束的语法因数据库而异。MySQL 8.0.16+支持CHECK约束，PostgreSQL和SQL Server也支持。语法可以是CHECK (price > 0)或CONSTRAINT chk_price CHECK (price > 0)。'
	},
	{
		id: 2024,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在MySQL中，TEXT类型有几种变体？',
		options: [
			{ key: 'A', text: '1种' },
			{ key: 'B', text: '4种：TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT' },
			{ key: 'C', text: '3种：TEXT, MEDIUMTEXT, LONGTEXT' },
			{ key: 'D', text: '2种：TEXT和LONGTEXT' }
		],
		answer: ['B'],
		explanation: 'MySQL有4种TEXT类型：TINYTEXT（最大255字节）、TEXT（最大65,535字节）、MEDIUMTEXT（最大16,777,215字节）、LONGTEXT（最大4,294,967,295字节）。'
	},
	{
		id: 2025,
		techId: 'sql',
		type: 'judge',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在MySQL中，VARCHAR的最大长度是65535字符。',
		options: [
			{ key: 'A', text: '正确' },
			{ key: 'B', text: '错误' }
		],
		answer: ['B'],
		explanation: '错误。VARCHAR的最大长度取决于字符集和行大小限制。对于UTF8字符集，VARCHAR最大长度约为21,844字符（因为UTF8字符最多占3字节）。实际限制还受到行大小65535字节的限制。'
	},
	{
		id: 2026,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在创建复合主键时，以下哪个说法是正确的？',
		options: [
			{ key: 'A', text: '复合主键的每个列都必须非空' },
			{ key: 'B', text: '复合主键的每个列都可以为空' },
			{ key: 'C', text: '复合主键中至少有一个列必须非空' },
			{ key: 'D', text: '复合主键的列可以重复，只要组合不重复即可' }
		],
		answer: ['A'],
		explanation: '在复合主键中，每个列都必须非空（NOT NULL）。主键要求唯一性和非空性，如果任何列为NULL，就无法保证唯一性。'
	},
	{
		id: 2027,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在ALTER TABLE时，如何重命名一个列？',
		options: [
			{ key: 'A', text: 'ALTER TABLE table RENAME COLUMN old TO new' },
			{ key: 'B', text: 'ALTER TABLE table CHANGE old new type' },
			{ key: 'C', text: 'ALTER TABLE table ALTER COLUMN old RENAME TO new' },
			{ key: 'D', text: '语法因数据库而异，MySQL用CHANGE，PostgreSQL用RENAME COLUMN' }
		],
		answer: ['D'],
		explanation: '重命名列的语法因数据库而异：MySQL使用ALTER TABLE table CHANGE old_column new_column type；PostgreSQL使用ALTER TABLE table RENAME COLUMN old TO new；SQL Server使用sp_rename。'
	},
	{
		id: 2028,
		techId: 'sql',
		type: 'multiple',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '以下哪些是MySQL中有效的日期时间类型？',
		options: [
			{ key: 'A', text: 'DATE' },
			{ key: 'B', text: 'TIME' },
			{ key: 'C', text: 'DATETIME' },
			{ key: 'D', text: 'TIMESTAMP' }
		],
		answer: ['A', 'B', 'C', 'D'],
		explanation: 'MySQL支持所有这些日期时间类型：DATE存储日期，TIME存储时间，DATETIME存储日期时间，TIMESTAMP存储时间戳（受时区影响，范围较小）。'
	},
	{
		id: 2029,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在MySQL中，如何设置列的默认值为当前时间？',
		options: [
			{ key: 'A', text: 'created_at TIMESTAMP DEFAULT NOW()' },
			{ key: 'B', text: 'created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP' },
			{ key: 'C', text: 'created_at DATETIME DEFAULT CURRENT_TIMESTAMP' },
			{ key: 'D', text: 'A和B都可以，但C在MySQL 5.6.5+才支持' }
		],
		answer: ['D'],
		explanation: '对于TIMESTAMP类型，可以使用NOW()或CURRENT_TIMESTAMP作为默认值。对于DATETIME类型，在MySQL 5.6.5+才支持CURRENT_TIMESTAMP作为默认值。'
	},
	{
		id: 2030,
		techId: 'sql',
		type: 'single',
		difficulty: 'hard',
		category: 'SQL基础语法',
		question: '在删除表时，如果表有外键被其他表引用，会发生什么？',
		options: [
			{ key: 'A', text: '直接删除成功' },
			{ key: 'B', text: '删除失败，必须先删除引用该表的外键' },
			{ key: 'C', text: '自动删除所有引用该表的外键' },
			{ key: 'D', text: '取决于数据库，MySQL会失败，PostgreSQL可以用CASCADE' }
		],
		answer: ['D'],
		explanation: '在MySQL中，如果表被外键引用，删除会失败。在PostgreSQL中，可以使用DROP TABLE ... CASCADE来级联删除所有依赖对象，包括外键约束。'
	}
];

